## Check how yaml2obj produces SHT_LLVM_ADDRSIG sections.

## Check we can describe SHT_LLVM_ADDRSIG using the "Symbols" tag. We can define
## symbols either using names or indexes.

# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s --check-prefix=SYMBOLS

# SYMBOLS:      Section {
# SYMBOLS:        Index: 1
# SYMBOLS-NEXT:   Name: .llvm_addrsig
# SYMBOLS-NEXT:   Type: SHT_LLVM_ADDRSIG
# SYMBOLS-NEXT:   Flags [
# SYMBOLS-NEXT:   ]
# SYMBOLS-NEXT:   Address: 0x0
# SYMBOLS-NEXT:   Offset: 0x40
# SYMBOLS-NEXT:   Size: 4
# SYMBOLS-NEXT:   Link: 2
# SYMBOLS-NEXT:   Info: 0
# SYMBOLS-NEXT:   AddressAlignment: 0
# SYMBOLS-NEXT:   EntrySize: 0
# SYMBOLS-NEXT:   SectionData (
# SYMBOLS-NEXT:     0000: 01020102
# SYMBOLS-NEXT:   )
# SYMBOLS-NEXT: }

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Symbols: [ foo, bar, 1, 2 ]
Symbols:
  - Name:    foo
    Type:    STT_FUNC
    Binding: STB_GLOBAL
  - Name:    bar
    Type:    STT_FUNC
    Binding: STB_GLOBAL

## Check we report an error if an unknown symbol is referenced in the
## SHT_LLVM_ADDRSIG section description.

# RUN: not yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=SYMBOL-UNKNOWN

# SYMBOL-UNKNOWN: error: unknown symbol referenced: 'foo' by YAML section '.llvm_addrsig'
# SYMBOL-UNKNOWN: error: unknown symbol referenced: 'bar' by YAML section '.llvm_addrsig'

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Symbols: [ foo, bar ]

## Check we can specify any arbitrary symbol indices.

# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: llvm-readobj --sections --section-data %t3 | FileCheck %s --check-prefix=SYMBOL-INDEX

# SYMBOL-INDEX:      Type: SHT_LLVM_ADDRSIG
# SYMBOL-INDEX:      SectionData (
# SYMBOL-INDEX-NEXT:   0000: 00FF01C4 E6888901 FFFFFFFF 0F
# SYMBOL-INDEX-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
## 0xFFFFFFFF is a maximum allowed index value.
    Symbols: [ 0, 255, 0x11223344, 0xFFFFFFFF ]

## Check that the maximum symbol index size is 32 bits.

# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=SYMBOL-INDEX-OVERFLOW

# SYMBOL-INDEX-OVERFLOW: error: unknown symbol referenced: '0x1122334455' by YAML section '.llvm_addrsig'

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Symbols: [ 0x1122334455 ]

## Check we can use the "Content" tag to specify any data for SHT_LLVM_ADDRSIG sections.

# RUN: yaml2obj --docnum=5 %s -o %t5
# RUN: llvm-readobj --sections --section-data %t5 | FileCheck %s --check-prefix=CONTENT

# CONTENT:      Type: SHT_LLVM_ADDRSIG
# CONTENT:      Size:
# CONTENT-SAME: 5
# CONTENT:      SectionData (
# CONTENT-NEXT:   0000: 11223344 55
# CONTENT-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Content: "1122334455"

## Check we emit an empty section if neither "Content", "Size" nor "Symbols" were set.

# RUN: yaml2obj --docnum=6 %s -o %t6
# RUN: llvm-readelf --sections %t6 | FileCheck %s --check-prefix=NO-TAGS

# NO-TAGS: [Nr] Name          Type         Address          Off    Size
# NO-TAGS: [ 1] .llvm_addrsig LLVM_ADDRSIG 0000000000000000 000040 000000

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG

## "Content" and "Symbols" cannot be used together to describe the SHT_LLVM_ADDRSIG section.

# RUN: not yaml2obj --docnum=7 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-SYMBOLS

# CONTENT-SYMBOLS: "Symbols" cannot be used with "Content" or "Size"

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Content: ""
    Symbols:

## Check we can set an arbitrary sh_link value for SHT_LLVM_ADDRSIG sections.

# RUN: yaml2obj --docnum=8 %s -o %t8
# RUN: llvm-readobj --sections %t8 | FileCheck %s --check-prefix=LINK

# LINK:      Name: .llvm_addrsig
# LINK:      Link:
# LINK-SAME:       123{{$}}

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Link: 123
    Content: ""

## Check we can use only "Size" to create a SHT_LLVM_ADDRSIG section.

# RUN: yaml2obj --docnum=9 %s -o %t9
# RUN: llvm-readobj --sections --section-data %t9 | FileCheck %s --check-prefix=SIZE

# SIZE:      Name: .llvm_addrsig
# SIZE:      Size:
# SIZE-SAME: 17
# SIZE:      SectionData (
# SIZE-NEXT:  0000: 00000000 00000000 00000000 00000000  |
# SIZE-NEXT:  0010: 00                                   |
# SIZE-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Size: 0x11

## Check we can use "Size" and "Content" together to create a SHT_LLVM_ADDRSIG section.

# RUN: yaml2obj --docnum=10 %s -o %t10
# RUN: llvm-readobj --sections --section-data %t10 | FileCheck %s --check-prefix=SIZE-CONTENT

# SIZE-CONTENT:      Name: .llvm_addrsig_sizegr
# SIZE-CONTENT:      Size:
# SIZE-CONTENT-SAME: 5
# SIZE-CONTENT:      SectionData (
# SIZE-CONTENT-NEXT:  0000: 11223300 00 |
# SIZE-CONTENT-NEXT: )

# SIZE-CONTENT:      Name: .llvm_addrsig_sizeeq
# SIZE-CONTENT:      Size:
# SIZE-CONTENT-SAME: 3
# SIZE-CONTENT:      SectionData (
# SIZE-CONTENT-NEXT:  0000: 112233 |
# SIZE-CONTENT-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name: .llvm_addrsig_sizegr
    Type: SHT_LLVM_ADDRSIG
    Size: 0x5
    Content: "112233"
  - Name: .llvm_addrsig_sizeeq
    Type: SHT_LLVM_ADDRSIG
    Size: 0x3
    Content: "112233"

## Check that when "Size" and "Content" are used together, the size
## must be greater than or equal to the content size.

# RUN: not yaml2obj --docnum=11 %s 2>&1 | FileCheck %s --check-prefix=SIZE-CONTENT-ERR

# SIZE-CONTENT-ERR: error: Section size must be greater than or equal to the content size

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Size: 0x1
    Content: "1122"

## Check we can't use "Size" and "Symbols" tags together.

# RUN: not yaml2obj --docnum=12 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-SYMBOLS

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name: .llvm_addrsig
    Type: SHT_LLVM_ADDRSIG
    Size: 0x1
    Symbols: [ ]
